package com.design.patterns.creativeModel.flyweight;

import com.design.patterns.creativeModel.flyweight.service.Student;

/**
 * 享元模式
 * 目的：运用共享技术有效地支持大量细粒度的对象。
 *
 * 享元（Flyweight）的核心思想很简单：如果一个对象实例一经创建就不可变，那么反复创建相同的实例就没有必要，
 * 直接向调用方返回一个共享的实例就行，这样即节省内存，又可以减少创建对象的过程，提高运行速度。
 */
public class FlyweightMain {

    public static void main(String[] args) {
        /**
         * 享元模式在Java标准库中有很多应用。
         * 我们知道，包装类型如Byte、Integer都是不变类，因此，反复创建同一个值相同的包装类型是没有必要的。
         * 以Integer为例，如果我们通过Integer.valueOf()这个静态工厂方法创建Integer实例，当传入的int范围在-128~+127之间时，会直接返回缓存的Integer实例：
         */
        Integer n1 = Integer.valueOf(100);
        Integer n2 = Integer.valueOf(100);
        System.out.println(n1 == n2); // true
        /**
         * 在实际应用中，享元模式主要应用于缓存，即客户端如果重复请求某些对象，不必每次查询数据库或者读取文件，而是直接返回内存中缓存的数据。
         * 我们现在新建一个类，在类中放置一个缓存Map
         * 我们创建的变量一致时，就会直接仓Map中去取，而不是创建一个
         */
        Student student = Student.create(1,"whh");
        Student student2 = Student.create(1,"whh");
        System.out.println(student == student2);
    }

}
